package com.acmen.easyapi.generator;

import com.acmen.easyapi.annotation.Param;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author acmen
 * 数字数据获取器
 */
@Component
public class NameDataGenerator implements DataGenerator, InitializingBean {
    private List<String> names = new ArrayList<>();

    /**
     * 重写的方法，用于判断给定的字段和参数是否匹配
     *
     * @param field 待匹配的字段
     * @param param 待匹配的参数
     * @return 如果匹配，则返回true；否则返回false
     */
    @Override
    public boolean matches(Field field, Param param) {
        // 如果param的标签以"姓名"结尾
        if (param.label().endsWith("姓名")) {
            // 返回true
            return true;
        }

        // 如果param的测试数据等于"name()"
        if (param.testData().equals("name()")) {
            // 返回true
            return true;
        }

        // 其他情况
        return false;
    }

    /**
     * 重写的方法，用于生成给定字段的合适参数值
     *
     * @param field 待生成参数值的字段
     * @param param 生成的参数值应与该参数匹配
     * @return 生成的参数值
     */
    @Override
    public Object generate(Field field, Param param) {
        // 判断字段类型是否为数组或者可分配为List类型
        if (field.getType().isArray() || List.class.isAssignableFrom(field.getType())) {
            // 创建一个随机对象
            Random random = new Random();
            // 生成一个随机索引值
            int idx = random.nextInt(names.size());
            // 返回一个包含随机索引值对应元素的数组
            return new Object[]{names.get(idx)};
        } else {
            // 创建一个随机对象
            Random random = new Random();
            // 生成一个随机索引值
            int idx = random.nextInt(names.size());
            // 返回随机索引值对应元素
            return names.get(idx);
        }
    }


    /**
     * 数据获取说明
     *
     * @return
     */
    @Override
    public String getNote() {
        String note = "姓名：";
        note += "当@ReqParam.name以'姓名'结尾或者@ReqParam.testData为'name()随机生成一个姓名。<br>";
        return note;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        names.add("萧峰");
        names.add("段誉");
        names.add("虚竹");
        names.add("慕容复");
        names.add("王语嫣");
        names.add("阿紫");
        names.add("段正淳");
        names.add("天山童姥");
        names.add("杨过");
        names.add("小龙女");
        names.add("郭靖");
        names.add("黄蓉");
        names.add("郭芙");
        names.add("郭襄");
        names.add("李莫愁");
        names.add("洪七公");
        names.add("丘处机");
        names.add("欧阳锋");
        names.add("周伯通");
        names.add("柯镇恶");
        names.add("赵志敬");
        names.add("周伯通");
        names.add("张无忌");
        names.add("赵敏");
        names.add("周芷若");
        names.add("成昆");
        names.add("杨逍");
        names.add("灭绝师太");
        names.add("范遥");
        names.add("谢逊");
        names.add("韦一笑");
        names.add("殷素素");
        names.add("张三丰");
        names.add("杨不悔");
        names.add("张三丰");
        names.add("俞岱岩");
        names.add("宋远桥");
    }
}
